x86/crash: disable the watchdog NMIs on the crashing cpu
authorDavid Vrabel <david.vrabel@citrix.com>
Fri, 22 Nov 2013 13:48:12 +0000 (14:48 +0100)
committerJan Beulich <jbeulich@suse.com>
Fri, 22 Nov 2013 13:48:12 +0000 (14:48 +0100)
commit2a16fcd5ba0244fef764886211452acc69c0ed00
tree6cd714854a6b8998088a628da853f22cd9571cf8
parente95dc6ba69daef6468b3ae5912710727244d6e2f
x86/crash: disable the watchdog NMIs on the crashing cpu

nmi_shootdown_cpus() is called during a crash to park all the other
CPUs.  This changes the NMI trap handlers which means there's no point
in having the watchdog still running.

This also disables the watchdog before executing any crash kexec image
and prevents the image from receiving unexpected NMIs.

Signed-off-by: David Vrabel <david.vrabel@citrix.com>
PVOps Linux as a kexec image shoots itself in the foot otherwise.

On a Core2 system, Linux declares a firmware bug and tries to invert some bits
in the performance counter register.  It ends up setting the number of retired
instructions to generate another NMI to fewer instructions than the NMI
interrupt path itself, and ceases to make any useful progress.

The call to disable_lapic_nmi_watchdog() must be this late into the kexec path
to be sure that this cpu is the one which will execute the kexec image.
Otherwise there are race conditions where the NMIs might be disabled on the
wrong cpu, resulting in the kexec image still receiving NMIs.

Signed-off-by: Andrew Cooper <andrew.cooper3@citrix.com>
xen/arch/x86/crash.c
xen/arch/x86/nmi.c
xen/include/asm-x86/apic.h